package Study1;

import Study2.Anime;


/*继承
1. 子类可以继承父类除父类的构造方法以外的所有
2.在Java中，使用关键字 extends 继承，但是只能继承一个父类，不可以多继承
3.子类在构造的时候，要先帮助父类进行构造方法的调用，
4.默认都用无参构造方法，一旦没有了，需要重新构造。
* */
class Base {
    public int a = 99;
}

class Derive extends Base {
    public int b = 999;
}

class Cat extends Anime {
    // 子类可以继承父类中除了构造方法以外的所有东西
    // 在父类中被 private 修饰的字段或方法，同样是被子类，所继承的，但是子类不可以访问被private的方法或字段
    // 子类默认都会调用父类的构造方法，默认情况下
    // 当默认的无参构造方法没有了，需要重写构造方法，不然，子类无法调用父类的构造方法，导致编译错误

    public String name;
    public Cat (String name) {
        super(name); // 通过 super父类的引用调用父类的构造方法，super必须放在第一行，
                     // 所以super(),调用父类的构造方法，只能有一句，只能在构造方法中使用，
                     // super 与 this 类似，是引用，不是本身
        System.out.println(" Cat子类，派生类的构造方法");
        this.name = name;
    }
/*this   和 super
this :当前对象的引用
this() 调用类中的构造方法，必须在第一行，只能在构造方法中使用，只有一个，因为必须在第一行
this.data : 访问类中的成员字段(属性)，(非静态的)
this.fun() : 调用本类的其他的成员方法 （非静态的）
super ：代表父类对象的引用
super() 调用父类中的构造方法，同this()，一样，必须在第一行，只能在构造方法中使用，只有一个，因为必须在第一行使用
super.data 调用父类中的成员字段(属性)(非静态的)
super.func() 调用本类中的其他的成员方法(非静态的)
在静态方法中，不可以使用 this 和 super，因为 this 和 super
表示的都是有关类的引用，与类无关，而类只有实例化 new 调用构造方法
才会加载到内存当中，而静态的优先加载到内存中，非静态，类还有(实例化)并没有加载到内存中在静态中 使用 this 或 super
就是一个已经加载到内存的东西，去访问一个没有加载到内存的东西，JVM虚拟机是不允许的

* */

}

public class Study18 {
    public static void main(String arg[]) {
        Cat cat = new Cat("cat");
        System.out.println(cat.name);

    }



    public static void main1(String arg[]) {
        Derive derive = new Derive();
        Base base = new Base();
        System.out.println(base.a);
//        System.out.println(base.b);
        System.out.println(derive.a);
        System.out.println(derive.b);
    }
}
